package model;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
 * 
 *Esta clase contiene la estructura de datos y metodos necesarios para administrar un usuario en el SistemaWeb 
 */
public class Usuario implements Comparable<Usuario>{

	private String nombre;
	private String apellido;
	private String userName;
	private String password;
	private List<String> areasDeExperiencia = new ArrayList<String>();
	private HashMap<String, Rol> asignaciones = new HashMap<String, Rol>();
	private CasillaDeCorreo casillaDeCorreo = new CasillaDeCorreo();
	private Date fechaDeIngresoAlSistema;

	/**
	 * CONSTRUTOR
	 * @param nombre String nombre del usuario
	 * @param apellido String apellido del usuario
	 * @param userName String usernam del usuario
	 * @param password String password del usuario
	 * @param areasDeExperiencia Lista de String con las areas que domina el Usuario
	 * @param casillaDeCorreo CasillaDeCorreo donde recibira los mails el usuario
	 */
	public Usuario(String nombre, String apellido, String userName,
			String password, List<String> areasDeExperiencia, CasillaDeCorreo casillaDeCorreo) {

		this.setNombre(nombre);
		this.setApellido(apellido);
		this.setUserName(userName);
		this.setPassword(password);
		this.getAreasDeExperiencia().addAll(areasDeExperiencia);
		this.setCasillaDeCorreo(casillaDeCorreo);
		this.setFechaDeIngreso(new Date());
	}

	
	public Date getFechaDeIngresoAlSistema(){
		return this.fechaDeIngresoAlSistema;
	}

	private void setFechaDeIngreso(Date dia){
		this.fechaDeIngresoAlSistema = dia;
	}
	
	
	private void setNombre(String nombre) {
		this.nombre = nombre;
	}

	private void setApellido(String apellido) {
		this.apellido = apellido;
	}

	private void setUserName(String userName) {
		this.userName = userName;
	}

	private void setCasillaDeCorreo(CasillaDeCorreo casillaDeCorreo) {
		this.casillaDeCorreo = casillaDeCorreo;
	}

	public String getApellido() {
		return apellido;
	}

	public String getUserName() {
		return userName;
	}
	
	public String getNombre() {
		return nombre;
	}

	public List<String> getAreasDeExperiencia() {
		return areasDeExperiencia;
	}

	public CasillaDeCorreo getCasillaDeCorreo() {
		return casillaDeCorreo;
	}
	
	protected String getPassword(){
		return this.password;
	}
	
	private void setPassword(String passwordNuevo) {
		this.password = passwordNuevo;
	}
	
	protected HashMap<String, Rol> getAsignaciones(){
		return this.asignaciones;
	}
	
	/**
	 * Cambia el password del usuario
	 * @param passwordActual
	 * @param passwordNuevo
	 * @throws PasswordIncorrectoException
	 */
	protected void changePassword(String passwordActual, String passwordNuevo) throws PasswordIncorrectoException{
		
		if (this.getPassword() == passwordActual){
			
			this.setPassword(passwordNuevo);
		}
		else{
			throw new PasswordIncorrectoException("Contraseña Incorrecta. Ingrese nuevamente su contraseña");
		}	
	}
	
	
	/**
	 * Retorna true si el trabajo que recibe como parametro es de su autoria, false en caso contrario
	 * @param trabajo
	 * @return
	 */
	boolean esMiTrabajo(Trabajo trabajo){
		return trabajo.getAutor() == this;
	}

	/**
	 * 
	 * @return HashMap con las asignaciones del Usuario en cada CFP
	 */
	public HashMap<String, Rol> verAsignaciones(){
		return this.getAsignaciones();
	}
	
	/**
	 * Selecciona las asignaciones del Usuario de determinado CFP a traves del nombre del mismo 
	 * @param nombreCfp String nombre del CFP
	 * @return
	 */
	public Rol seleccionarAsignacion(String nombreCfp){
		return this.getAsignaciones().get(nombreCfp);
	}
	
	
	/**
	 * Muestra todos los mails que recibio el usuario
	 * @return
	 */
	public List<Mail> verMails(){
		return this.getCasillaDeCorreo().getCorreosRecibidos();
	}
	
	/**
	 * Crea una asignacion al Usuario, con el nombre del CFP que recibe como parametro y el rol que
	 * cumple en el mismo
	 * @param nombreCfp
	 * @param rol
	 */
	protected void crearAsignacion(String nombreCfp, Rol rol){
	
		this.getAsignaciones().put(nombreCfp, rol);
	}

	/**
	 * Agrega un trabajo a la lista de trabajos correspondiente al CFP que recibe como parametro
	 * @param trabajo
	 * @param cfp
	 */
	protected void agregarTrabajo(Trabajo trabajo, CFP cfp){
		
		this.seleccionarAsignacion(cfp.getNombre()).agregarTrabajo(trabajo);
	}

	/**
	 * Este metodo sirve para comparar a un Usuario por fecha de Ingreso al Sistema
	 * Se utiliza en el algoritmo de ingreso por fecha de ingreso.
	 * 
	 */
	public int compareTo(Usuario usuario) {
		if(this.getFechaDeIngresoAlSistema().after(usuario.getFechaDeIngresoAlSistema())){
			return 1;
		}
		else{
			if(this.getFechaDeIngresoAlSistema().before(usuario.getFechaDeIngresoAlSistema())){
				return -1;
			}
			else{
				return 0;
			}
		}
	}
	
}
